package com.njtech.pet.service.impl;

import com.njtech.pet.constant.Constant;
import com.njtech.pet.dao.FriendDao;
import com.njtech.pet.dao.UserDao;
import com.njtech.pet.entity.Friend;
import com.njtech.pet.entity.User;
import com.njtech.pet.service.UserService;
import com.njtech.pet.utils.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Random;

/**
 * Author:gm
 * Date:2020-03-08 16:38
 * Description:<描述>
 * @author gmisa
 */
@Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;
    @Autowired
    private FriendDao friendDao;

    /**
     * 根据用户id找user
     * @param id
     * @return
     */
    @Override
    public User selectByUserId(Integer id) {
        return userDao.selectByUserId(id);
    }

    /**
     * 根据用户名找到有效用户
     * @param username
     * @return
     */
    @Override
    public User findByName(String username){
        User user = new User();
        user.setUsername(username);
        return userDao.selectByUserNameAndUserId(user);
    }

    /**
     * 插入一个用户
     * @param user
     * @return 插入行数
     */
    @Override
    public String insert(User user) {

        String role = user.getRole();
        String msg="注册成功";
        int flag02;
        //插入一个新用户信息
        int flag01 = userDao.insert(user);
        if(flag01!=1){
            msg="注册失败";
        }
        //找到一个对应的客服
        Friend friend = new Friend();
        User user1 =  userDao.selectByUserNameAndState(user.getUsername(),Constant.User.STATE_VALID.getValue()).get(0);
        friend.setUser(user1);
        User tempUser = new User();
        tempUser.setRole(Constant.User.ROLE_SERVICE.getValue());
        List<User> servicerList = userDao.selectElasticly(tempUser,null,null,null,null);
        Random random = new Random();
        //和客服进行绑定
        User servicer;
        if(servicerList.size()-1 > 0){
            servicer = servicerList.get(random.nextInt(servicerList.size()-1));
        }
        else{
            servicer = servicerList.get(0);
        }
        //只有这种情况需要绑定客服，管理员不用
        if(role.equals("普通用户")||role.equals("会员")) {
            //绑定客服
            friend.setFriend(servicer);
            friend.setState(Constant.Friend.STATE_CUSTOMER_SERVICE.getValue());
            flag02 = friendDao.insert(friend);
            if(flag02!=1){
                msg="注册失败";
            }
        }
        return msg;
    }

    /**
     * 修改用户密码
     * @param user
     * @return 修改函数
     */
    @Override
    public int updateUserPwd(User user){
        userDao.updateByUserId(user);
        return  userDao.updateByUserId(user);
    }

    /**
     * 修改用户个人信息
     * @param user
     * @return 修改行数
     */
    @Override
    public int updateUser(User user){
        return userDao.updateByUserId(user);
    }

    /**
     * 根据用户名和用户状态查找用户
     * @param username 欲查找的用户名
     * @param state 用户状态
     * @return
     */
    @Override
    public List<User> selectByUserNameAndState(String username, String state) {
        return userDao.selectByUserNameAndState(username,state);
    }

    /**
     * 根据用户封装的id、用户名（用户名单关键字模糊查询）、性别、角色、状态 以及提供的创建和修改日期的起止日期范围进行灵活选择
     * @param uid
     * @param username
     * @param sex
     * @param role
     * @param state
     * @param beginCreateDate
     * @param endCreateDate
     * @param beginUpdateDate
     * @param endUpdateDate
     * @return
     */
    @Override
    public List<User> selectElasticly(Integer uid,String username,String sex,String role, String state,String beginCreateDate, String endCreateDate, String beginUpdateDate, String endUpdateDate) {
        //非空字符串判断
        if(username.equals("")){
            username = null;
        }
        if(sex.equals("")){
            sex=null;
        }
        if(role.equals("")){
            role=null;
        }
        if(state.equals("")){
            state=null;
        }
        User user = new User();
        user.setId(uid);
        user.setUsername(username);
        user.setSex(sex);
        user.setRole(role);
        user.setState(state);
        if(beginCreateDate.equals("")){
            beginCreateDate=null;
        }
        if(endCreateDate.equals("")){
            endCreateDate=null;
        }
        if(beginUpdateDate.equals("")){
            beginUpdateDate=null;
        }
        if(endUpdateDate.equals("")){
            endUpdateDate=null;
        }

        List<User>userList = userDao.selectElasticly(user,beginCreateDate,endCreateDate,beginUpdateDate,endUpdateDate);

        return userList;
    }

    /**
     *
     * @param operatorRole   操作人角色
     * @param user       要修改的用户的用户名
     * @param newPwd         新密码
     * @param oldPwd         旧密码
     * @return
     */
    @Override
    public String changePwd(String operatorRole,User user,String newPwd,String oldPwd){
        String msg = null;
        if(operatorRole.endsWith("管理员")){
            newPwd=Constant.User.PWD_DEFAULT.getValue();
            user.setPwd(Md5Util.MD5EncodeUtf8(newPwd));
            userDao.updateByUserId(user);
            msg="密码已重置";
        }else {
            if (oldPwd.equals("") || oldPwd == null || newPwd.equals("") || newPwd == null) {
                msg = "新旧密码不能为空！";
            }
            if (user != null) {
                //找到用户！
                if (Md5Util.MD5EncodeUtf8(oldPwd).equals(user.getPwd())) {
                    //如果旧密码正确 ,设置新密码
                    user.setPwd(Md5Util.MD5EncodeUtf8(newPwd));
                    if (oldPwd.equals(newPwd)) {
                        //如果新旧密码一样，不允许
                        msg = "新密码不能和原密码相同！";
                    } else {
                        //新旧密码不同才允许
                        int flag = userDao.updateByUserId(user);
                        //更新密码的方法
                        if (flag == 1) {
                            msg = "密码修改成功";
                        } else {
                            msg = "密码修改失败";
                        }
                    }
                } else {
                    //旧密码不正确
                    msg = "密码错误！";

                }
            } else {
                msg = "用户不存在！";

            }
        }
        return msg;
    }
}
